[S3] フォルダ内のオブジェクトをすべて削除したらフォルダごと削除された

[S3] フォルダ内のオブジェクトをすべて削除したらフォルダごと削除された

はじめに

こんにちは、パオの人ことさすけです!
今回は、S3 バケットのフォルダにあるオブジェクトをすべて削除した時に、フォルダも消えてしまった!というケースの種明かし的なお話になっています。実はマネジメントコンソールでフォルダを作成した時と、CLI コマンドで作成した時では若干異なっているのです、、。

S3 バケットの「フォルダ」はどういう仕組み?

まず前提として押さえておかなければならない部分が「S3 バケットは実際にフォルダを作成している訳ではない」という点です。
簡単にいうと「キーバリュー型になっているだけ」です。フォルダ配下にオブジェクトを配置したとすると、フォルダ名 というキーに オブジェクト名 というバリューがあるだけという形なんです。

詳細については、下記ブログで検証してくれているので本記事の内容をスッと理解していただくためにもぜひ読んでいただければ幸いです。

https://dev.classmethod.jp/articles/amazon-s3-folders/

それぞれの方法でフォルダを作成

さて、ここからは検証を行なっていきます。
まずはマネジメントコンソールでフォルダを作成してみましょう。

マネジメントコンソール

今回は test-pao-pk10 というバケットにマネジメントコンソールから pao というフォルダを作成しました。

image-9

このフォルダに、以下の「アップロード」からオブジェクトをアップロードします。

image-10

オブジェクトが以下のように作成されましたね。

image-11

CLI コマンド

次に、CLI コマンドでフォルダを作成しオブジェクトをアップロードしていきます。
下記コマンドを実行してみます。

aws s3 cp /path/to/local/PAO.JPG s3://test-pao-pk10/pk10/PAO.JPG

マネジメントコンソールで確認してみると、以下のように pk10 というフォルダが作成されていました。

image-12

フォルダ内にも、先ほど作成した PAO.JPG が表示されていますね。

image-13

マネジメントコンソールと CLI コマンドで作成したフォルダの比較

次にこれまで作成した pao フォルダと pk10 フォルダの比較をしていきましょう。
下記 CLI コマンドにて、s3://test-pao-pk10 配下にあるファイルの一覧を取得できます。

$ aws s3 ls s3://test-pao-pk10 --recursive

2024-12-20 10:45:19          0 pao/  # マネジメントコンソールで作成したフォルダ
2024-12-20 10:50:09    1485391 pao/PAO.JPG
2024-12-20 10:55:22    1485391 pk10/PAO.JPG  # CLI コマンドで作成したフォルダおよびオブジェクト

上記のようにマネジメントコンソールで作成したフォルダ pao の場合は、pao というキーに対して 空のバリュー を持つように作成されているため、オブジェクトがなくても フォルダ自体がある種 1 つのオブジェクトとして扱われています

一方で、CLI コマンドで作成したフォルダ pk10 に関しては、pk10 というキーに対して PAO.JPG というバリューを持つファイルのみで pk10 に対する 空のバリューがありません

フォルダ内のオブジェクトを削除してみる

それでは最後に、削除してみましょう。

pk10 フォルダ内のオブジェクトを削除してみる

順番が前後して申し訳ないですが、まずは気になってる方が多いと思われる CLI コマンドで作成されたフォルダ(pk10)内のオブジェクトを削除してみましょう。

画面収録-2024-12-20-11.23.39 (2)

すると上記をみてわかる通り、フォルダ内のオブジェクトを削除しただけで フォルダも削除されてしまいました

pao フォルダ内のオブジェクトを削除してみる

次に、マネジメントコンソールで作成されたフォルダ(pao)内のオブジェクトを削除してみましょう。

画面収録-2024-12-20-11.32.40 (2)

すると今度はフォルダは残っていますね。先ほど 解説した通りフォルダが 1 つオブジェクトとして扱われているため フォルダ内のオブジェクトを削除してもフォルダは削除されません

両方のオブジェクトが削除されたこのタイミングで最後にファイルの一覧だけ取得してみましょう。

$ aws s3 ls s3://test-pao-pk10 --recursive

2024-12-20 11:16:17          0 pao/

すると、上記のように pk10 フォルダは削除されており、pao フォルダのみが残っていることが確認できましたね。

まとめ

お疲れ様でした!ありがとうございました!
まとめとしては以下のとおりですね。

  • マネジメントコンソールで作成されたフォルダは オブジェクトのように扱われるため、フォルダ内のオブジェクトを削除しても残る
  • CLI コマンドで作成されたフォルダは、フォルダ内のオブジェクトをすべて削除したらフォルダも削除される

個人的には、すごく興味深い内容でした。
検証を行っている最中にフォルダが消えるのはどうしてだろうと思っていたらこんなことになっていたんですね。

参考文献

Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする | DevelopersIO

アノテーション株式会社

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.